home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -seriously_amiga- / shareware / programming / other / apic / examples / amikeyterm.asm < prev    next >
Assembly Source File  |  1998-01-05  |  6KB  |  431 lines

  1.  
  2.  
  3. ;PIC16C84 keybord controller for Amiga keybords
  4. ;pressed keys are located in table and send in serial ascii format (19200baud)
  5. ;
  6. ;Dirk Duesterberg duesterb@unixserv.rz.fh-hannover.de
  7. ;                 http://linux.rz.fh-hannover.de/~duesterb
  8.  
  9.  
  10.     list    p=PIC16C84, r=dec, s=on
  11.  
  12.  
  13.     device    HS_OSC, WDT_OFF
  14.     xtal    4000000
  15.  
  16. PortA    = 05h
  17. PortB    = 06h
  18. pcl    = 02h
  19.  
  20.  
  21.  
  22. #define    ACLK    PortA,0
  23. #define    ADAT    PortA,1
  24.  
  25. #define    TXD    PortA,2
  26. #define c    3,0
  27. #define z    3,2
  28.  
  29. RA    =    5        ;PortA is register 5
  30.  
  31.  
  32.  
  33.  
  34.     CBLOCK    0ch
  35.  
  36.        count0
  37.        count1
  38.        Akeydat
  39.        serbuf
  40.  
  41.     ENDC
  42.  
  43.  
  44.  
  45.     movlw    11111011b        ;pin 2 is output (TXD)
  46.     tris    PortA
  47.  
  48.     movlw    0            ;PortB is output
  49.     tris    PortB
  50.  
  51.     goto    Reset
  52.  
  53.  
  54.  
  55. rawkeys    movf    Akeydat,w
  56.     andlw    7fh            ;clr bit 7 (make/break or pressed/unpressed)
  57.     addwf    pcl,f
  58.  
  59.  
  60. ; characters, numbers and spezial keys
  61. ; $00-$3F
  62.  
  63.     retlw    00h            ;00h
  64.     retlw    00h            ;01h
  65.     retlw    00h            ;02h
  66.     retlw    00h            ;03h
  67.     retlw    00h            ;04h
  68.     retlw    00h            ;05h
  69.     retlw    00h            ;06h
  70.     retlw    00h            ;07h
  71.  
  72.     retlw    00h            ;08h
  73.     retlw    00h            ;09h
  74.     retlw    00h            ;0Ah
  75.     retlw    00h            ;0Bh
  76.     retlw    00h            ;0Ch
  77.     retlw    00h            ;0Dh
  78.     retlw    00h            ;0Eh    
  79.     retlw    00h            ;0Fh
  80.  
  81.  
  82.  
  83.     retlw    "q"            ;10h
  84.     retlw    "w"            ;11h
  85.     retlw    "e"            ;12h
  86.     retlw    "r"            ;13h
  87.     retlw    "t"            ;14h
  88.     retlw    "z"            ;15h
  89.     retlw    "u"            ;16h
  90.     retlw    "i"            ;17h
  91.  
  92.     retlw    "o"            ;18h
  93.     retlw    "p"            ;19h
  94.     retlw    "ü"            ;1Ah
  95.     retlw    "+"            ;1Bh
  96.     retlw    00h            ;1Ch
  97.     retlw    00h            ;1Dh
  98.     retlw    00h            ;1Eh
  99.     retlw    00h            ;1Fh
  100.  
  101.  
  102.  
  103.     retlw    "a"            ;20h
  104.     retlw    "s"            ;21h
  105.     retlw    "d"            ;22h
  106.     retlw    "f"            ;23h
  107.     retlw    "g"            ;24h
  108.     retlw    "h"            ;25h
  109.     retlw    "j"            ;26h
  110.     retlw    "k"            ;27h
  111.  
  112.     retlw    "l"            ;28h
  113.     retlw    "ö"            ;29h
  114.     retlw    "ä"            ;2Ah
  115.     retlw    00h            ;2Bh
  116.     retlw    00h            ;2Ch
  117.     retlw    00h            ;2Dh
  118.     retlw    00h            ;2Eh
  119.     retlw    00h            ;2Fh
  120.  
  121.  
  122.  
  123.     retlw    00h            ;30h
  124.     retlw    00h            ;31h
  125.     retlw    00h            ;32h
  126.     retlw    00h            ;33h
  127.     retlw    00h            ;34h
  128.     retlw    00h            ;35h
  129.     retlw    00h            ;36h
  130.     retlw    00h            ;37h
  131.  
  132.     retlw    00h            ;38h
  133.     retlw    00h            ;39h
  134.     retlw    00h            ;3Ah
  135.     retlw    00h            ;3Bh
  136.     retlw    00h            ;3Ch
  137.     retlw    00h            ;3Dh
  138.     retlw    00h            ;3Eh
  139.     retlw    00h            ;3Fh
  140.  
  141. ; other spezial keys (space, TAB, Return)
  142. ; $40-$4F
  143.  
  144.     retlw    00h            ;40h
  145.     retlw    00h            ;41h
  146.     retlw    00h            ;42h
  147.     retlw    00h            ;43h
  148.     retlw    00h            ;44h
  149.     retlw    00h            ;45h
  150.     retlw    00h            ;46h
  151.     retlw    00h            ;47h
  152.  
  153.     retlw    00h            ;48h
  154.     retlw    00h            ;49h
  155.     retlw    00h            ;4Ah
  156.     retlw    00h            ;4Bh
  157.     retlw    00h            ;4Ch
  158.     retlw    00h            ;4Dh
  159.     retlw    00h            ;4Eh
  160.     retlw    00h            ;4Fh
  161.  
  162.  
  163. ; Function keys, Help etc.
  164. ; $50-$5F
  165.  
  166.     retlw    00h            ;50h
  167.     retlw    00h            ;51h
  168.     retlw    00h            ;52h
  169.     retlw    00h            ;53h
  170.     retlw    00h            ;54h
  171.     retlw    00h            ;55h
  172.     retlw    00h            ;56h
  173.     retlw    00h            ;57h
  174.  
  175.     retlw    00h            ;58h
  176.     retlw    00h            ;59h
  177.     retlw    00h            ;5Ah
  178.     retlw    00h            ;5Bh
  179.     retlw    00h            ;5Ch
  180.     retlw    00h            ;5Dh
  181.     retlw    00h            ;5Eh
  182.     retlw    00h            ;5Fh
  183.  
  184.  
  185.  
  186. ; shifting keys like shift, amiga, Alternate and Control
  187. ; $60-6F
  188.     
  189.     retlw    00h            ;60h
  190.     retlw    00h            ;61h
  191.     retlw    00h            ;62h
  192.     retlw    00h            ;63h
  193.     retlw    00h            ;64h
  194.     retlw    00h            ;65h
  195.     retlw    00h            ;66h
  196.     retlw    00h            ;67h
  197.  
  198.     retlw    00h            ;68h
  199.     retlw    00h            ;69h
  200.     retlw    00h            ;6Ah
  201.     retlw    00h            ;6Bh
  202.     retlw    00h            ;6Ch
  203.     retlw    00h            ;6Dh
  204.     retlw    00h            ;6Eh
  205.     retlw    00h            ;6Fh
  206.  
  207.  
  208. ;spezial keybord commandos
  209. ; $70-$7F
  210.  
  211.     retlw    00h            ;70h    
  212.     retlw    00h            ;71h
  213.     retlw    00h            ;72h
  214.     retlw    00h            ;73h
  215.     retlw    00h            ;74h
  216.     retlw    00h            ;75h
  217.     retlw    00h            ;76h
  218.     retlw    00h            ;77h
  219.  
  220.     retlw    00h            ;78h
  221.     retlw    00h            ;79h=F9h= letzter tasten code war fehlerhaft
  222.     retlw    00h            ;7Ah=FAh= tastenpuffer im keybord voll
  223.     retlw    00h            ;7Bh
  224.     retlw    00h            ;7Ch=FCh= selbsttest der tastatur war fehlerhaft
  225.     retlw    00h            ;7Dh=FDh= beginn der beim Einschalten gedrueckten Tasten
  226.     retlw    00h            ;7Eh=FEh= ende der beim Einschalten gedrueckten Tasten
  227.     retlw    00h            ;7Fh
  228.  
  229.     
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252. Reset    clrf    Akeydat            ;Akeydat is used as character counter
  253.  
  254. check    movlw    11
  255.     subwf    Akeydat,w        ;how many characters ?
  256.     btfsc    z
  257.     goto    ready
  258.  
  259.     call    dat
  260.     movwf    serbuf
  261.     call    sendb            ;send letter
  262.     incf    Akeydat,f
  263.     goto    check
  264.  
  265.  
  266.  
  267. dat    movf    Akeydat,w        ;letter to w routine
  268.     addwf    pcl,f            ;jump in table
  269.     retlw    "mache RESET"
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277. ready    call    sync
  278.  
  279.  
  280.  
  281.  
  282. rcADAT    movlw    7
  283.     movwf    count0
  284.  
  285. :loop    call    wACLK            ;wait for Amiga CLK
  286.     rlf    Akeydat,f        ;rotate bits into register
  287.     decfsz    count0,f
  288.     goto    :loop            ;format is x6543210
  289.  
  290.  
  291.     rlf    Akeydat,f        ;format is 6543210x
  292.     call    wACLK            ;wait for Amiga CLK
  293.     rrf    Akeydat,f        ;format is 76543210, jippije
  294.     comf    Akeydat,f        ;data is inverted
  295.  
  296.     movlw    5
  297.     call    wms            ;wait 5 ms
  298.  
  299. ;    mov    serbuf,Akeydat
  300. ;    call    sendb            ;send raw data
  301.  
  302.  
  303.     call    rawkeys
  304.     movwf    serbuf
  305.  
  306.     btfss    Akeydat,7        ;no sending if key up flag is set
  307.     call    sendb            ;send the in table found code
  308.  
  309.     call    AHshake            ;all data OK, do the Handshake
  310.     goto    rcADAT            ;receive next byte from keybord
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322. sync    call    wACLK            ;wait for clock and do no Acknowledge
  323.     
  324.     movlw    250
  325.     call    wms            ;wait 250 ms (we want the sync mode!)
  326.  
  327.     call    wACLK            ;wait for Amiga CLK for Handshake
  328.  
  329.     movlw    1
  330.     call    wms            ;wait 1 ms
  331.  
  332.     call    AHshake            ;now we do the shake!
  333.     return
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340. wms    movwf    count0
  341.  
  342. :loop    movlw    248
  343.     movwf    count1
  344. :do_it    nop
  345.  
  346.     decfsz    count1,f
  347.     goto    :do_it
  348.  
  349.     decfsz    count0,f
  350.     goto    :loop
  351.  
  352.     return
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359. AHshake    movlw    11111001b        ;bit1 = ADAT = output
  360.     tris    RA
  361.  
  362.     bcf    ADAT            ;clr Amiga data line
  363.     
  364.     movlw    40
  365.     movwf    count0            ;40 * 3 = 120cycles = 120 µs (min 75µs)
  366. :do_it    decfsz    count0,f
  367.     goto    :do_it
  368.  
  369.     movlw    11111011b        ;bit1 = ADAT = input
  370.     tris    RA
  371.     return
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378. wACLK    btfsc    ACLK            ;wait for neg clock pulse
  379.     goto    wACLK
  380.  
  381.     btfss    ADAT
  382.     bcf    c
  383.     btfsc    ADAT
  384.     bsf    c            ;mov the data to carry bit
  385.  
  386. wACLK2    btfss    ACLK            ;wait for pos clock pulse
  387.     goto    wACLK2
  388.     return
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396. sendb    call    wbit            ;this are stop bits from previous sending
  397.     call    wbit
  398.  
  399.     bsf    TXD            ;send startbit
  400.     movlw    8
  401.     movwf    count0            ;8 bits to send
  402.     comf    serbuf,f        ;invert serbuf
  403.  
  404. s_it    call    wbit
  405.     rrf    serbuf,f
  406.  
  407.     btfss    c
  408.     bcf    TXD
  409.     btfsc    c
  410.     bsf    TXD
  411.  
  412.     decfsz    count0,f
  413.     goto    s_it            ;all bits send ? decrement the bitcounter
  414.  
  415.     call    wbit
  416.     bcf    TXD            ;clear TXD, stopbit, lenght is defined by 
  417.                     ;next sending
  418.     return
  419.  
  420.  
  421.  
  422.  
  423.  
  424. wbit    movlw    13
  425.     movwf    count1            ;19200 at 4 Mhz
  426. :loop    decfsz    count1,f
  427.     goto    :loop
  428.     nop
  429.     return
  430.  
  431.